package de.bahn.dbs.diva.provider;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import de.bahn.dbs.diva.db.Auftrag;
import de.bahn.dbs.diva.db.Vorgang;
import de.bahn.dbs.diva.db.VorgangsMitarbeiter;
import de.bahn.dbs.diva.objects.AuftragObjekt;
import de.bahn.dbs.diva.objects.MitarbeiterObjekt;
import de.bahn.dbs.diva.objects.VorgangObjekt;

public class DivaGateway {

	private static final String LOG_TAG = DivaGateway.class.getSimpleName();
	
	private Context mContext;

	public DivaGateway(Context pContext) {
		mContext = pContext;
	}

	public List<AuftragObjekt> holeAlleAuftraege() {

		Uri uri = Auftrag.CONTENT_URIS.BASE;

		String sortOrder = Auftrag.DEFAULT_SORT_ORDER;
		Cursor assignmentCursor = null;

		try {
			assignmentCursor = mContext.getContentResolver().query(uri,
					null, null, null, sortOrder);

			if (assignmentCursor == null) {
				Log.w(LOG_TAG, "Assignment cursor is null!");
				return null;
			} else {
				return getAssignmentFromCursor(assignmentCursor);
			}
		} finally {
			if (assignmentCursor != null) {
				assignmentCursor.close();
			}
		}
	}

	public List<VorgangObjekt> holeVorgaengeZuAuftrag(int auftragsID) {

		Uri uri = Vorgang.CONTENT_URIS.BASE;

		String sortOrder = Vorgang.DEFAULT_SORT_ORDER;
		String selection = Vorgang.AUFTRAGS_ID + " = " + String.valueOf(auftragsID);
		Cursor proceduresCursor = null;

		try {
			proceduresCursor = mContext.getContentResolver().query(uri, null,
					selection, null, sortOrder);

			if (proceduresCursor == null) {
				Log.w(LOG_TAG, "Assignment cursor is null!");
				return null;
			} else {
				return getProceduresFromCursor(proceduresCursor);
			}
		} finally {
			if (proceduresCursor != null) {
				proceduresCursor.close();
			}
		}
	}

	public AuftragObjekt holeAuftrag(int id){
		
		Uri uri = Auftrag.CONTENT_URIS.BASE;

		String sortOrder = Auftrag.DEFAULT_SORT_ORDER;
		Cursor assignmentCursor = null;
		String selection = Auftrag._ID + " = " + String.valueOf(id);
		try {
			assignmentCursor = mContext.getContentResolver().query(uri, null,
					selection, null, sortOrder);

			if (assignmentCursor == null) {
				Log.w(LOG_TAG, "Assignment cursor is null!");
				return null;
			} else {
				List<AuftragObjekt> auftraege = getAssignmentFromCursor(assignmentCursor);
				return auftraege.get(0);
			}
		} finally {
			if (assignmentCursor != null) {
				assignmentCursor.close();
			}
		}
	}

	public VorgangObjekt holeVorgang(int vorgangsId) {
		Uri uri = Vorgang.CONTENT_URIS.BASE;

		String sortOrder = Vorgang.DEFAULT_SORT_ORDER;
		Cursor assignmentCursor = null;
		String selection = Vorgang._ID + " = " + String.valueOf(vorgangsId);
		try {
			assignmentCursor = mContext.getContentResolver().query(uri, null,
					selection, null, sortOrder);

			if (assignmentCursor == null) {
				Log.w(LOG_TAG, "Assignment cursor is null!");
				return null;
			} else {
				List<VorgangObjekt> auftraege = getProceduresFromCursor(assignmentCursor);
				return auftraege.get(0);
			}
		} finally {
			if (assignmentCursor != null) {
				assignmentCursor.close();
			}
		}
	}

	public void setTaskLock(long id, boolean lock) {
		Uri uri = Uri.withAppendedPath(Auftrag.CONTENT_URIS.BASE, "" + id);
		// String selection = Auftrag._ID + " = " + String.valueOf(id);

		ContentValues values = new ContentValues();
		
		values.put(Auftrag.LOCKED, lock ? 1 : 0);
		int update = mContext.getContentResolver().update(uri, values, null,
				null);
		
		Log.i("Save Lock", "" + update);
		Log.i("Save Lock", "" + id);
		
	}

	public List<MitarbeiterObjekt> holeMitarbeiter(int vorgangsId) {
		Uri uri = VorgangsMitarbeiter.CONTENT_URIS.BASE;

		String sortOrder = VorgangsMitarbeiter.DEFAULT_SORT_ORDER;
		Cursor assignmentCursor = null;
		String selection = VorgangsMitarbeiter.VORGANGS_ID + " = "
				+ String.valueOf(vorgangsId);
		try {
			assignmentCursor = mContext.getContentResolver().query(uri, null,
					selection, null, sortOrder);

			if (assignmentCursor == null) {
				Log.w(LOG_TAG, "Assignment cursor is null!");
				return null;
			} else {
				List<MitarbeiterObjekt> mitarbeiter = getPeopleFromCursor(assignmentCursor);
				return mitarbeiter;
			}
		} finally {
			if (assignmentCursor != null) {
				assignmentCursor.close();
			}
		}
	}

	private List<MitarbeiterObjekt> getPeopleFromCursor(Cursor pCursor) {

		List<MitarbeiterObjekt> mitarbeiter = new ArrayList<MitarbeiterObjekt>();

		if (!pCursor.moveToFirst()) {
			return null;
		}

		int idIndex = pCursor.getColumnIndex(VorgangsMitarbeiter._ID);
		int lableIndex = pCursor.getColumnIndex(VorgangsMitarbeiter.LABLE);
		int signaturIndex = pCursor
				.getColumnIndex(VorgangsMitarbeiter.SIGNATUR);

		long id;
		String lable;
		byte[] signature;

		do {
			id = pCursor.getLong(idIndex);
			lable = pCursor.getString(lableIndex);
			signature = pCursor.getBlob(signaturIndex);

			mitarbeiter.add(new MitarbeiterObjekt(id, lable, signature));
		} while (pCursor.moveToNext());

		return mitarbeiter;
	}

	private List<AuftragObjekt> getAssignmentFromCursor(Cursor pCursor) {

		List<AuftragObjekt> auftraege = new ArrayList<AuftragObjekt>();

		if (!pCursor.moveToFirst()) {
			return auftraege;
		}

		int idIndex = pCursor.getColumnIndex(Auftrag._ID);
		int gleisIndex = pCursor.getColumnIndex(Auftrag.GLEIS);
		int verbundIndex = pCursor.getColumnIndex(Auftrag.VERBUND);
		int positionIndex = pCursor.getColumnIndex(Auftrag.POSITION);
		int fahrzeugIndex = pCursor.getColumnIndex(Auftrag.FAHRZEUG_NR);
		int lockIndex = pCursor.getColumnIndex(Auftrag.LOCKED);

		long id;
		int gleis;
		String verbund;
		String position;
		String fahrzeugNr;
		int lock;

		do {
			id = pCursor.getLong(idIndex);
			gleis = pCursor.getInt(gleisIndex);
			verbund = pCursor.getString(verbundIndex);
			position = pCursor.getString(positionIndex);
			fahrzeugNr = pCursor.getString(fahrzeugIndex);
			lock = pCursor.getInt(lockIndex);

			auftraege.add(new AuftragObjekt(id, gleis, verbund, position,
					fahrzeugNr, lock > 0 ? true : false));

		} while (pCursor.moveToNext());

		return auftraege;
	}

	private List<VorgangObjekt> getProceduresFromCursor(Cursor pCursor) {

		List<VorgangObjekt> vorgaenge = new ArrayList<VorgangObjekt>();

		if (!pCursor.moveToFirst()) {
			return vorgaenge;
		}

		int idIndex = pCursor.getColumnIndex(Vorgang._ID);
		int vorgangsNrIndex = pCursor.getColumnIndex(Vorgang.VORGANGS_NR);
		int kuerzelIndex = pCursor.getColumnIndex(Vorgang.KUERZEL);
		int beschreibungIndex = pCursor.getColumnIndex(Vorgang.BESCHREIBUNG);
		int typKuerzelIndex = pCursor.getColumnIndex(Vorgang.TYP_KUERZEL);
		int schadenstypIndex = pCursor.getColumnIndex(Vorgang.SCHADENSTYP);
		int schadensanzahlIndex = pCursor
				.getColumnIndex(Vorgang.SCHADENS_ANZAHL);
		int auftragsIndex = pCursor.getColumnIndex(Vorgang.AUFTRAGS_ID);

		int id;
		String vorgangsNr;
		String kuerzel;
		String beschreibung;
		String typKuerzel;
		String schadenstyp;
		int schadensanzahl;
		int auftragsId;

		do {
			id = pCursor.getInt(idIndex);
			vorgangsNr = pCursor.getString(vorgangsNrIndex);
			kuerzel = pCursor.getString(kuerzelIndex);
			beschreibung = pCursor.getString(beschreibungIndex);
			typKuerzel = pCursor.getString(typKuerzelIndex);
			schadenstyp = pCursor.getString(schadenstypIndex);
			schadensanzahl = pCursor.getInt(schadensanzahlIndex);
			auftragsId = pCursor.getInt(auftragsIndex);

			vorgaenge.add(new VorgangObjekt(id, vorgangsNr, kuerzel,
					beschreibung, typKuerzel, schadenstyp, schadensanzahl,
					null, auftragsId));

		} while (pCursor.moveToNext());

		return vorgaenge;
	}

	public void saveMitarbeiter(String pLable, byte[] pSignature, long pId) {

		Uri uri = VorgangsMitarbeiter.CONTENT_URIS.BASE;
		ContentValues values = new ContentValues();

		Log.i("URI", uri.toString());

		values.put(VorgangsMitarbeiter.LABLE, pLable);
		values.put(VorgangsMitarbeiter.SIGNATUR, pSignature);
		values.put(VorgangsMitarbeiter.VORGANGS_ID, pId);

		Uri result = mContext.getContentResolver().insert(uri, values);


	}
}
